﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using Sinacor.Infra.UI.Authorization;

namespace Sinacor.UI.Bovespa.ImportacaoExportacao.Presenter.IdentificacaoArquivo
{
    public class Distribuicao : IdentificacaoBase
    {
        private string _header;
        private Model.Enum.TipoFormatoArquivo _tipoFormatoArquivo;
        private XmlDocument _xmlDoc;

        public Distribuicao(Model.Enum.TipoSistema tipoSistema)
            : base(tipoSistema)
        {
        }

        public override Model.Enum.TipoArquivo TipoArquivo
        {
            get { return Model.Enum.TipoArquivo.TORDIST; }
        }

        public override bool IdentificarArquivoTXT(string arquivo)
        {
            string tipoArquivo;
            bool retorno = false;
            System.IO.StringReader reader = new System.IO.StringReader(arquivo);
            _header = reader.ReadLine();

            if (!String.IsNullOrEmpty(_header) &&
                _header.Length >= 23)
            {
                tipoArquivo = _header.Substring(16, 7);
                
                _tipoFormatoArquivo = Model.Enum.TipoFormatoArquivo.TXT;

                retorno = (tipoArquivo == "TORDIST");
            }

            reader.Close();
            reader.Dispose();

            return retorno;
        }

        public override bool IdentificarArquivoXML(XmlDocument xmlDoc)
        {
            string tipoArquivo;
            bool retorno = false;

            if (xmlDoc["identificador"] != null
               && xmlDoc["identificador"].Attributes["arquivo"] != null)
            {
                tipoArquivo = xmlDoc["identificador"].Attributes["arquivo"].Value;
                _tipoFormatoArquivo = Model.Enum.TipoFormatoArquivo.XML;

                if (tipoArquivo == "TORDIST")
                {
                    _xmlDoc = xmlDoc;
                    retorno = true;
                }
            }

            return retorno;
        }

        public override bool IdentificarDataPregao(out DateTime dataPregao)
        {
            bool retorno = false;
            dataPregao = default(DateTime);

            if (_tipoFormatoArquivo == Model.Enum.TipoFormatoArquivo.TXT)
            {
                DateTime.TryParseExact(_header.Substring(1, 10), "dd/MM/yyyy", new System.Globalization.DateTimeFormatInfo(), System.Globalization.DateTimeStyles.None, out dataPregao);
            }
            else
            {
                DateTime.TryParse(_xmlDoc["identificador"]["evento"].Attributes["pregao"].Value, out dataPregao);
            }

            retorno = (dataPregao != default(DateTime));

            return retorno;
        }

        public override bool VerificarPermissaoAcesso()
        {
            return AuthorizationManager.GetInstance().CheckUserAccess("ORD", "IDIS");
        }

        public override bool VerificarPermissaoArquivoModulo()
        {
            return (TipoSistema == Model.Enum.TipoSistema.Ordens);
        }
    }
}
